home *** CD-ROM | disk | FTP | other *** search
/ Your Choice 3 / Your Choice Software Collection 3.iso / prgmming / swag08 / redirect.swg < prev    next >
Text File  |  1994-09-22  |  7KB  |  1 lines

  1. SWAGOLX.EXE (c) 1993 GDSOFT  ALL RIGHTS RESERVED 00002                                                                           1      08-25-9409:10ALL                      TODD A. JACOBS           Redirect output          SWAG9408    ªb÷    12     åu   { From: tjacobs@clark.net (Todd A. Jacobs) }πunit Redir;π πinterfaceπ πusesπ  Dos;π πfunction SetOutput(FileName: PathStr): Boolean;πprocedure CancelOutput;π πimplementationπ πconstπ  OutRedir: Boolean = False;π πfunction SetOutput(FileName: PathStr): Boolean;πbeginπ  FileName:=FileName+#0;π  SetOutput:=False;π  asmπ    push  dsπ    mov   ax, ssπ    mov   ds, axπ    lea   dx, FileName[1]π    mov   ah, 3Chπ    int   21hπ    pop   dsπ    jnc   @@1π    retπ@@1:π    push  axπ    mov   bx, axπ    mov   cx, Output.FileRec.Handleπ    mov   ah, 46hπ    int   21hπ    mov   ah, 3Ehπ    pop   bxπ    jnc   @@2π    retπ@@2:π    int   21hπ  end;π  OutRedir:=True;π  SetOutput:=True;πend;ππprocedure CancelOutput;πvarπ  FileName: String[4];πbeginπ  if not OutRedir then Exit;π  FileName:='CON'#0;π  asmπ    push  dsπ    mov   ax, ssπ    mov   ds, axπ    lea   dx, FileName[1]π    mov   ax, 3D01hπ    int   21hπ    pop   dsπ    jnc   @@1π    retπ@@1:π    push  axπ    mov   bx, axπ    mov   cx, Output.FileRec.Handleπ    mov   ah, 46hπ    int   21hπ    mov   ah, 3Ehπ    pop   bxπ    int   21hπ  end;π  OutRedir:=False;πend;ππend.π{πStandard output will be changed to FileName. The FileName can be NUL.πWhen yourπexecuted program is using int $10, all is hardly. In your main program use:ππSetOutput('NUL');πExec(....);πCancelOutput;π}ππ                                                                               2      08-25-9409:11ALL                      MATTHEW MASTRACCI        EXEC with i/o redirectionSWAG9408    ╖└*ç    41     åu   {πFrom: Matthew.Mastracci@matrix.cpubbs.cuug.ab.ca (Matthew Mastracci)ππ tf> A simple example:π tf> SwapVectors;π tf> Exec (GetEnv('comspec'), '/c dir *.* > FileName');π tf> SwapVectors;ππThis is a good way to do redirection for directory listings and the like,πbut a better way is to use this unit:  (I wrote it from an idea given to me byπsomeone else posting the same sort of this, except this one includes errorπchecking and containm much more useful procedures)  From this, you can go:ππSwapVectors;πRedirectOutput('\DIRLIST.TXT');πExec(GetEnv('COMSPEC'), '/C DIR *.*');πStdOutput;πSwapVectors;ππSame thing, but more control...ππHere's my REDIR.PAS unit:ππ  Redirection unitππ  - Original author unknown, rewritten by Matthew Mastracciπ  - Added a bit of asm, pipe support, some better file handling ability, moreπ     flexibilityπ  - If you'd like some information on this program, E-Mail me at:π     madhacker@matrix.cpubbs.cuug.ab.caπ  - Feel free to distribute this source anywhere! (Public Domain)π}ππunit Redir;ππinterfaceππ{ Redirects standard input from a textfile/device  ie: command < filename }πprocedure RedirectInput(TextFile : String);ππ{ Redirects standard output to a textfile/device  ie: command > filename }πprocedure RedirectOutput(TextFile : String);ππ{ Redirects standard error to a textfile/device }πprocedure RedirectError(TextFile : String);ππ{ Redirects standard output and error to a textfile/device }πprocedure RedirectAllOutput(TextFile : String);ππ{ Redirects all I/O from a textfile  ie: ctty device }πprocedure RedirectAll(TextFile : String);ππ{ Restores STDIN to CON }πprocedure StdInput;ππ{ Restores STDOUT to CON }πprocedure StdOutput;ππ{ Restores STDERR to CON }πprocedure StdError;ππ{ Creates a unique file and returns its name (used for piping) }πfunction UniqueFile : String;ππimplementationππuses Dos;ππvar InFile, OutFile, ErrFile : Text;ππconstπ  STDIN  = 0;       { Standard Input }π  STDOUT = 1;       { Standard Output }π  STDERR = 2;       { Standard Error }π  Redirected : array[0..2] of Boolean = (False, False, False);ππ{ Duplicates a file handle }πprocedure ForceDup (Existing, Second : Word);πvar f, Error : Word;πbeginπ  asmπ    mov ah, $46π    mov bx, Existingπ    mov cx, Secondπ    int $21π    pushfπ    pop bxπ    mov f, bxπ    mov Error, axπ  end;π  if (f and FCarry) <> 0 thenπ    Writeln ('Error ', Error, ' changing handle ', Second);πend;ππ{ Redirects standard input from a textfile/device  ie: command < filename }πprocedure RedirectInput(TextFile : String);πbeginπ  if Redirected[STDIN] then StdInput;π  Redirected[STDIN] := True;π  Assign(InFile, TextFile);π  Reset(InFile);π  ForceDup(TextRec(InFile).Handle, STDIN);πend;ππ{ Redirects standard output to a textfile/device  ie: command > filename }πprocedure RedirectOutput(TextFile : String);πbeginπ  if Redirected[STDOUT] then StdOutput;π  Redirected[STDOUT] := True;π  Assign(OutFile, TextFile);π  Rewrite(OutFile);π  ForceDup(TextRec(OutFile).Handle, STDOUT);πend;ππ{ Redirects standard error to a textfile/device }πprocedure RedirectError(TextFile : String);πbeginπ  if Redirected[STDERR] then StdError;π  Redirected[STDERR] := True;π  Assign(ErrFile, TextFile);π  Rewrite(ErrFile);π  ForceDup(TextRec(ErrFile).Handle, STDERR);πend;ππ{ Redirects standard output and error to a textfile/device }πprocedure RedirectAllOutput(TextFile : String);πbeginπ  RedirectOutput(TextFile);π  RedirectError(TextFile);πend;ππ{ Redirects all I/O from a textfile  ie: ctty device }πprocedure RedirectAll(TextFile : String);πbeginπ  RedirectInput(TextFile);π  RedirectOutput(TextFile);π  RedirectError(TextFile);πend;ππ{ Restores STDIN to CON }πprocedure StdInput;πbeginπ  if Redirected[STDIN] then beginπ    Redirected[STDIN] := False;π    RedirectInput('CON');π    Close(InFile);π  end;πend;ππ{ Restores STDOUT to CON }πprocedure StdOutput;πbeginπ  if Redirected[STDOUT] then beginπ    Redirected[STDOUT] := False;π    RedirectOutput('CON');π    Close(OutFile);π  end;πend;ππ{ Restores STDERR to CON }πprocedure StdError;πbeginπ  if Redirected[STDERR] then beginπ    Redirected[STDERR] := False;π    RedirectOutput('CON');π    Close(OutFile);π  end;πend;ππfunction UniqueFile : String;πconst FName : array[1..20] of Char = '\' + #0 + '                  ';πvar FSeg, FOfs : Word;π    FileName : String;πbeginπ  FSeg := Seg(FName);π  FOfs := Ofs(FName) + 1;π  asmπ    push dsπ    mov ax, FSegπ    mov ds, axπ    mov dx, FOfsπ    mov ah, $5aπ    mov cx, 0π    int $21π    pop dsπ  end;π  Move(FName, FileName[1], 9);π  FileName[0] := #9;π  UniqueFile := FileName;πend;ππend.ππ{ This is how you can do piping.  It is equivilent to: }π{ type \autoexec.bat | find "ECHO" | sort /R }ππ{$M $1000,0,0}πprogram PipeDemo;πuses Redir, Dos;πvar FName : String;ππbeginπ  FName := UniqueFile;π  WriteLn('Temporary file: ', FName);π  WriteLn('Output from pipe:');π  RedirectInput('\AUTOEXEC.BAT');π  RedirectOutput(FName);π  Exec('C:\DOS\FIND.EXE', '"ECHO"');π  RedirectInput(FName);π  RedirectOutput('CON');π  Exec('C:\DOS\SORT.EXE', '/R');πend.π